/**
* 版权所有:版权所有(C) 2020，卓信科技
* 系统名称:FOL-财务管理系统
* 文件名称:BeanUtils.java
* 模块名称:TODO(这里请补充模块名称)
* 创建日期:2020年5月19日
* 作        者:baisong
* 内容摘要:TODO(解决BeanUtilscopy在Properties遇到null的情况)
*/
package com.zx.emanage.util.gen;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import org.springframework.beans.BeansException;
import org.springframework.beans.FatalBeanException;
import org.springframework.util.Assert;

/**
 * 类  名  称:BeanUtils
 * 内容摘要:TODO(解决BeanUtilscopy在Properties遇到null的情况)
 * 作        者:baisong
 */
public abstract class BeanUtils extends org.springframework.beans.BeanUtils
{
	/**
	 * @Title: copyProperties
	 * @param @param
	 *            target
	 * @param @param
	 *            source
	 * @param @throws
	 *            BeansException
	 * @return void
	 * @author: wangyihan
	 * @time: 2020年8月3日 下午4:26:01 history: 1、2020年8月3日 下午4:26:01 wangyihan 创建方法
	 *
	 */
	public static void copyProperties(Object target, Object source) throws BeansException
	{
		Assert.notNull(source, "Source must not be null");
		Assert.notNull(target, "Target must not be null");
		Class<?> actualEditable = target.getClass();
		PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable);
		// 循环
		for (PropertyDescriptor targetPd : targetPds)
		{
			// 判断
			if (targetPd.getWriteMethod() != null)
			{
				PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());
				// 判断
				if (sourcePd != null && sourcePd.getReadMethod() != null)
				{
					try
					{
						Method readMethod = sourcePd.getReadMethod();
						// 循环
						if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers()))
						{
							readMethod.setAccessible(true);
						}
						Object value = readMethod.invoke(source);
						// 这里判断以下value是否为空 当然这里也能进行一些特殊要求的处理 例如绑定时格式转换等等
						if (value != null)
						{
							Method writeMethod = targetPd.getWriteMethod();
							// 判断
							if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers()))
							{
								writeMethod.setAccessible(true);
							}
							writeMethod.invoke(target, value);
						}
					} 
					catch (Throwable ex)
					{
						throw new FatalBeanException("Could not copy properties from source to target", ex);
					}
				}
			}
		}
	}
}
